package cn.itcast.reflect;

import cn.itcast.domain.Person;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;

/**
 * 假设的框架类
 *
 * 1.配置文件
 * 2.反射
 * 步骤：
 * 1.将需要创建的对象的全类名和方法配置在配置文件中
 * 2.程序加载配置文件
 * 3.创建对象
 * 4.执行方法
 */
public class ReflectTest {

    public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
        //可以常见任意的对象和调用方法
        Person person = new Person();
        person.eat();

        //缺点是耦合度太高

        //1.加载配置文件  -->调用load()方法
        //1.1 创建Properties对象
        Properties properties = new Properties();
        //1.2加载配置文件，转换为一个集合
        //先获得当前对象的类加载器，他来帮助他加载进内存
        ClassLoader classLoader = ReflectTest.class.getClassLoader();
        InputStream resourceAsStream = classLoader.getResourceAsStream("pro.properties");
        properties.load(resourceAsStream);

        //获取配置文件中的数据
        
        //用键值对的形式获取
        String className = properties.getProperty("className");
        String methodName = properties.getProperty("methodName");

        //要在不改变任何代码的情况下来实现创建不同的类

        //3.加载该类进内存
        Class<?> cls = Class.forName(className);//这个方法返回的是一个类对象
        //创建对象
        Object obj = cls.newInstance();
        //获取对象方法对象
        Method method = cls.getMethod(methodName);
        //执行方法
        method.invoke(obj);


    }
}
